package cn.itcast.nems.order.api;

import cn.itcast.nems.order.dto.*;
import cn.itcast.nems.studentrecord.constant.OrderSourceEnum;
import cn.itcast.nems.studentrecord.dto.StudentRecordLockDTO;

import java.util.List;

/**
 * <p>
 * 订单相关操作 ,如: 新建、支付回调
 * </p>
 *
 * @author zhouwei
 * @since 2023/9/15 9:15 AM
 **/
public interface OrderApi {
    /**
     * 功能描述：创建订单
     *
     * @param order 新订单
     * @return 订单号
     * @author 刘曙
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     * @since 2023年9月11日
     */
    CreateOrderResultDTO create(NewOrderDTO order);

    String  getJournalLineIdByOrderId(String orderId , OrderSourceEnum orderSourceEnum)  ;

    /**
     * 功能描述：按照订单ID取消订单
     *
     * @param id 订单ID
     * @return 是否取消成功
     * @author 刘曙
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     * @since 2023年10月9日
     */
    Boolean cancel(String id);

    /**
     * 功能描述：按照业务订单号取消订单
     *
     * @param bizOrderNo 业务订单号
     * @return 是否取消成功
     * @author 刘曙
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     * @since 2023年10月9日
     */
    Boolean cancelByBizNo(String bizOrderNo);


    /**
     * 根据业务订单号查询订单详情
     *
     * @param bizOrderNo 业务订单号
     * @return OrderMode
     */
    OrderMode findByBizOrderNo(String bizOrderNo);


    /**
     * 查询订单上优惠
     *
     * @param orderId 订单ID
     * @return 订单上的优惠信息
     */
    List<OrderModeDiscountDTO> findOrderDiscounts(String orderId);

    /**
     * 查询订单行信息
     *
     * @param orderId 订单ID
     * @return 订单行信息
     */
    List<OrderModeLineDTO> findOrderLines(String orderId);

    /**
     * 根据订单ID获取订单详情
     * @author 高昌露
     * @since 2023/11/24 16:07
     * @param orderId 清单ID
     * @return cn.itcast.nems.order.dto.OrderMode
     */
    OrderMode findById(String orderId);
    /**
     * 增加订单流水
     * @param flowDTO
     */
    void addPaymentFlow(PaymentFlowDTO flowDTO) ;

    /**
     * <p>
     * 根据学籍ID查询订单详情
     * </p>
     *
     * @param studentRecordId 学籍ID
     * @author zhouwei
     * @since 2024/3/28 4:51 PM
     **/
    OrderMode findByStudentRecordId(String studentRecordId) ;


}
